import java.util.ArrayList;
import java.util.List;

public class question_78 {
}
class Solution_78 {
    //我有两种想法
    //写一个求m的n次方的一个函数
    //方法一：通过二进制的方式
//    int calculate(int n,int m){
//        if(n==0)
//            return 1;
//        else
//            return m*calculate(n-1,m);
//    }
//    public List<List<Integer>> subsets(int[] nums) {
//        //
//        List<List<Integer>> result=new ArrayList<>();
//        int sum=calculate(nums.length,2);
//        for (int i = 0; i<sum; i++) {
//            int temp=i;
//            int j=0;//用来记录nums数组的下标
//            List<Integer> l=new ArrayList<>();
//            while(temp!=0){
//                if(temp%2!=0){//说明当前对应nums数组对应j下标的值应该加入
//                    l.add(nums[j]);
//                }
//                temp=temp/2;
//                j++;
//            }
//            result.add(l);
//        }
//        return result;
//    }
//
//    //方法二 扩张法，在第77题组合的基础上进行一个一个的添加，即比如nums有四个数，则分别将C40,C41，C42，C43，C44的各种组合分别加入
//    void dfs(int arr[],int k,List<Integer> l,List<List<Integer>> result,int m){
//        if(l.size()==k){
//            result.add(new ArrayList<>(l));
//            return;
//        }
//        for (int i = m; i <arr.length; i++) {
//            l.add(arr[i]);
//            dfs(arr,k,l,result,i+1);
//            l.remove(l.size()-1);//移除最末尾的数字
//        }
//    }
//    public List<List<Integer>> subsets(int[] nums) {
//        List<List<Integer>> result=new ArrayList<>();
//        for (int i = 0; i <=nums.length; i++) {
//            dfs(nums,i,new ArrayList<>(),result,0);
//        }
//        return result;
//    }

    //方法三 在原来的基础上进行添加哈哈
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        result.add(new ArrayList<Integer>());
        for (int i = 0; i < nums.length; i++) {
            int n = result.size();
            for (int j = 0; j < n; j++) {
                ArrayList<Integer> temp = new ArrayList<>(result.get(j));
                temp.add(nums[i]);
                result.add(temp);
            }
        }
        return result;
    }

    public static void main(String[] args) {

    }
}
//class salve extends Thread{
//    public static int ticker=200;
//
//    @Override
//    public void run() {
//        while (ticker>0){
//            int temp=ticker;
//            try {
//                sleep(100);
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//            System.out.println(currentThread().getName()+" 买票："+temp);
//            ticker--;
//        }
//    }
//
//    public static void main(String[] args) {
//        salve s1=new salve();
//        salve s2=new salve();
//        salve s3=new salve();
//        s1.setName("售票员1");
//        s2.setName("售票员2");
//        s3.setName("售票员3");
//        s1.start();
//        s2.start();
//        s3.start();
//    }
//}

class salve implements Runnable{
    private int ticker=100;
    Object obj=new Object();
    @Override
    public void run() {
        synchronized (obj){
            while(ticker>=1){
                int temp=ticker;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName()+": "+temp+" 号票");
                ticker--;
            }
        }
    }

    public static void main(String[] args) {
        salve s=new salve();
        Thread a=new Thread(s);
        Thread b=new Thread(s);
        Thread c=new Thread(s);
        a.setName("售票员1");
        b.setName("售票员2");
        c.setName("售票员3");
        a.start();
        b.start();
        c.start();
    }
}
//写一个程序测试死锁问题
class sisuotest{
    public static void main(String[] args) {
        StringBuffer s1=new StringBuffer();//锁1
        StringBuffer s2=new StringBuffer();//锁2
        //创建了匿名类的匿名对象
        new Thread(){
            @Override
            public void run() {
                synchronized (s1){
                    s1.append('a');
                    s2.append('1');
                    try {//让它睡个1秒钟
                        sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized (s2){
                        System.out.println(s1);
                        System.out.println(s2);
                    }
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                synchronized (s2){
                    s1.append('b');
                    s2.append('2');
                    try {//让它睡个1秒钟
                        sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized (s1){
                        System.out.println(s1);
                        System.out.println(s2);
                    }
                }
            }
        }.start();
    }
}